package com.example.demo.api;

import com.alibaba.fastjson.JSON;
import com.example.demo.model.Order;
import com.example.demo.model.Paging;
import com.example.demo.model.Result;
import com.example.demo.param.QueryOrderParam;
import com.example.demo.service.OrderService;
import com.example.demo.service.ProductService;
import com.example.demo.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.concurrent.CompletableFuture;

@Controller
@RequestMapping("/api/order")
public class OrderAPI {
    @Autowired
    private OrderService orderService;

    @Autowired
    private UserService userService;

    @Autowired
    private ProductService productService;

    @Autowired
    private KafkaTemplate kafkaTemplate;

    /**
     * 下单
     * @param order 订单模型，需要包含商品
     * @return
     */
    @PostMapping("/add")
    @ResponseBody
    public Result<Order> add(Order order, HttpServletRequest request) {
        Result<Order> result=new Result<>();
        if (order.getProductDetailId()==null){
            result.setMessage("商品详情ID为空");
            return result;
        }
        order.setUserId((Long) request.getAttribute("userId"));
        result.setData(orderService.add(order));
        //异步发送通知
        //CompletableFuture.supplyAsync()：这是 CompletableFuture 类的一个静态方法，用于异步执行一个有返回值的任务
        //thenAccept()：这是 CompletableFuture 的一个方法，用于在 supplyAsync 中的任务执行完成后，对其返回结果进行处理。
        //System.out::println 是一个方法引用，等价于 (result) -> System.out.println(result)，它会把 sendNotify 方法的返回结果打印到控制台。
        CompletableFuture.supplyAsync(()-> sendNotify(result.getData())).thenAccept(System.out::println);
        //发送下单信息到kafka
        kafkaTemplate.send("dewuOrder", JSON.toJSONString(order));
        result.setSuccess(true);
        return result;
    }

    /**
     * 发送下单通知
     * 通知格式为 "用户xxx下单了商品xxx"
     * @param order 订单
     */
    private boolean sendNotify(Order order) {
        //通知格式
        String notifyFormat="用户%s下单了商品%s";
        //1.获取用户名
        String userName=userService.getUserById(order.getUserId()).getNickName();
        //2.获取商品名称
        String productName=productService.get(order.getProductId()).getName();
        //3.发送通知
        kafkaTemplate.send("notify", String.format(notifyFormat,userName,productName));
        return true;
    }

    /**
     * 查询商品最近订单数据
     * @param param 查询参数(页码、每页数量、商品ID、 订单状态、开始时间)
     * @return
     */
    @PostMapping("/queryRecentPay")
    @ResponseBody
    public Result<Paging<Order>> queryRecentPay(QueryOrderParam param) {
        Result<Paging<Order>> result=new Result<>();
        if (param==null){
            result.setMessage("查询参数为空");
        }else if (param.getProductId()==null){
            result.setMessage("商品ID为空");
        }else {
            result.setData(orderService.queryRecentPay(param));
            result.setSuccess(true);
        }
        return result;
    }
}
